package cn.tedu.ticket;/**
 * @Author 金帮嘉诚 @Date 2021-06-23 星期三 21:14
 */
/*本类用于测试*/

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 知识点
 * 线程池ExecutorService的创建和使用：
 * 创建：
 * 通过 Executors 工具类调用  newFixedThreadPool() 或其他方法创建，参数为线程的个数
 * 使用：
 * 用循环来定义多个线程  用  ExecutorService  类的对象调用  execute（）方法，参数为完成业务的类的对象，
 * <p>
 * 创建的线程数不会多于池子中的线程数
 */
public class TestPool {
    public static void main(String[] args) {
        TicketRunnableV1 ticketRunnableV1 = new TicketRunnableV1();

        ExecutorService executorService2 = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 10; i++) {
            executorService2.execute(ticketRunnableV1);
        }
        /*线程池ExecutorServices，用于存储线程的池子，新建启动关闭线程都交给池操作
         *
         * 创建Executor，用于创建线程池的工具类
         * newFixedThreadPool(线程数)，该方法用于创建一个指定线程数的线程池
         * */
//        ExecutorService executorService = Executors.newFixedThreadPool(5);
//        for (int i = 0; i < 5; i++) {
//            /*executor（）让线程池中的线程来执行任务，每次调用都会启动一个线程，
//             * 方法的参数是要执行的自定义业务，也就是目标对象*/
//            //Required type:
//            //Runnable
//            executorService.execute(ticketRunnableV1);
//        }
    }
}

class TicketRunnableV1 implements Runnable {
    //class TicketRunnableV1{
    int ticketNumber = 100;

    @Override
    public void run() {
        while (true) {
            synchronized (TicketRunnableV1.class) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if (ticketNumber > 0) {
                    System.out.println(Thread.currentThread().getName() + " = " + ticketNumber--);
                }
                if (ticketNumber <= 0) break;
            }
        }
    }
}
